#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<list>
using namespace std;


//链表： 不是随机迭代器，不可以使用sort(l.begin(),l.end());
//应该使用l.sort()

//int main()
//{
//	list<int>l{ 3,2,43,1 };
//	l.sort();//正确写法  升序
//
//	//sort(l.begin(), l.end());//error，不可以
//
//	l.sort(greater<int>());//降序
//	for (auto i : l)
//		cout << i << " ";
//	return 0;
//}



//list容器构造函数
//void printList(const list<int>& l)
//{
//	for (auto it = l.begin();it != l.end();it++)
//	{
//		cout << *it << " ";
//	}
//	cout << endl;
//}
//
//
//
//void test()
//{
//	//创建list容器
//	list<int>l = { 12,12,32 };
//
//	//添加数据
//	/*l.push_back(10);
//	l.push_back(20);
//	l.push_back(30);
//	l.push_back(40);*/
//
//	printList(l);
//
//}
//int main()
//{
//	test();
//	return 0;
//}


//队list的长度操作

//void test()
//{
//	list<int>l;
//	l.push_back(10);
//	l.push_back(20);
//	l.push_back(30);
//
//	printList(l);
//
//	//判断容器是否是空
//	if (l.empty())
//	{
//		cout << "L为空";
//	}
//	else
//	{
//		cout << "不空";
//		cout << l.size() << endl;
//	}
//
//	//重新指定大小
//	l.resize(10);
//	printList(l);
//
//
//}
//int main()
//{
//	test();
//	return 0;
//}


//判断是否是空 empty
//判断大小  size
//重新指定 resize

//list容器的删除和插入

//void test()
//{
//	list<int>l{ 1,2,3,4 };
//	printList(l);
//
//	//尾插 头插
//	l.push_back(0);
//	l.push_front(5);
//	printList(l);
//
//	//头删  尾删
//	l.pop_back();
//	l.pop_front();
//	printList(l);
//
//	//insert()插入
//	auto it = l.begin();
//	l.insert(++it, 100); //在头部插入100  注意这里的++it 和 it++ 有区别
//	printList(l);
//	   
//	//删除
//	l.erase(++it);
//	printList(l);
//
//	//移除:移除，删除容器中所有与elem 值所匹配的值
//	l.push_back(10000);
//	printList(l);
//	l.remove(10000);
//	printList(l);
//
//	//清空
//	l.clear();
//	printList(l);
//
//}
//int main()
//{
//	test();
//	return 0;
//}


//list数据存取
//front() 返回第一个元素
//back() 返回最后一个元素

//list容器 数据存取
//void test()
//{
//	list<int>l{ 1,2,3,4 };
//	
//	//l[0] 不可以通过[]访问list容器中的元素
//	//l.at(0) 不可以用at 方式访问list容器中的元素
//	//原因是：list本质是链表，不是用连续线性的空间存储数据，迭代器也是不支持随机访问的
//	cout << "第一个元素为： " << l.front() << endl;
//	cout << "最后一个元素是： " << l.back() << endl;
//
//	//验证迭代器是不支持随机访问的
//	auto it = l.begin();
//	it++; //没问题
//
//	//it += 3; //error 加三不可以
//	
//}
//




//list反转和排序
//reverse 反转链表
//sort   排序
//bool myCompare(int v1, int v2)  
//{
//	//降序
//	return v1 > v2;
//}
//
//void test()
//{
//	list<int>l{ 12,34,5,2,4 };
//	cout << "反转前的 ：";
//	printList(l);
//
//	cout << "反转后 ：";
//	l.reverse();
//	printList(l);
//
//	cout << "排序后 ：";
//	l.sort(); //默认是升序
//	l.sort(myCompare); //成员函数  降序 需要写一个函数， 然后把函数作为参数传递给它
//	//sort(l.begin(), l.end());  //error 所有不支持随机访问迭代器的，不可以用标准算法  
//	//不支持随机访问迭代器的容器，内部会提供一些算法  不可以使用全局函数
//	printList(l);
//}
//int main()
//{
//	test();
//	return 0;
//}




//#include <iostream>
//#include <list>
//
//using namespace std;
//
// 模拟约瑟夫环问题，返回最后剩下的节点的编号
//int josephus(int n, int m) 
//{
//    
//    //使用一个循环链表
//    list<int> people;
//
//    // 初始化人员列表
//    for (int i = 1; i <= n; ++i) 
//    {
//        people.push_back(i);
//    }
//
//    //定义当前的迭代器
//    auto current = people.begin();//迭代器
//
//	  //当不知道循环的具体次数时，优先使用while循环
//    while (people.size() != 1)
//    {
//        // 移动迭代器，模拟报数过程
//        for (int i = 1; i < m; ++i) 
//        {
//            ++current;//迭代器往前走
//            if (current == people.end()) 
//            {
//                current = people.begin(); // 如果到达末尾，则从头开始
//            }
//        }
//
//        // 删除当前节点，并移动迭代器到下一个节点
//        current = people.erase(current);
//        if (current == people.end()) 
//        {
//            current = people.begin(); // 如果删除的是末尾节点，则将迭代器移到开头
//        }
//    }
//
//    // 返回最后剩下的节点的编号
//    return *(people.begin());
//}
//
//int main() 
//{
//    int n = 5; // 总人数
//    int m = 3; // 报数为 3 的人出列
//
//    int survivor = josephus(n, m);
//    cout << "最后剩下的人的编号是：" << survivor << endl;
//
//    return 0;
//}



//list双向循环链表,不支持随机访问，任何位置插入和删除都很快
//int main()
//{
//	list<int>l{1,32,12,21,42};
//
//	//它自己提供了sort函数，优先使用list自己提供的算法
//	l.sort();
//	for (auto i : l)
//		cout << i << " ";
//	cout << endl;
//	return 0;
//}


//添加数据 头插 尾插 随便插
//int main()
//{
//	list<int>l1{ 1,2,3,4 };
//	for (auto it = l1.begin();it != l1.end();it++)
//		cout << *it << " ";
//	cout << endl;
//
//	//从后往前输出11的内容
//	for (auto it = l1.rbegin();it != l1.rend();it++)
//		cout << *it << " ";
//	cout << endl;
//	return 0;
//}



//输入两行数字，第一行一个数字n
//第二行n个数字，保存到list当中

//3
//4 7 2

//int main()
//{
//	int n;
//	cin >> n;
//	list<int>l(n);//创建长度位n的list
//	for (int i = 1;i <= n;i++)
//	{
//		int x;
//		l.push_back(x);
//	}
//}


//迭代器只能++ 和 -- ，不能+1和+2操作















